/*
 * SPDX-FileCopyrightText: 2022 Andrew Gunnerson
 * SPDX-License-Identifier: GPL-3.0-only
 */

package com.sanji.audio_test.format

import android.media.MediaCodec
import android.media.MediaFormat
import java.nio.ByteBuffer

/**
 * 用于将编码后的样本数据写入容器格式的抽象接口
 */
interface Container {
    /**
     * 启动复用器进程
     *
     * 必须在调用 [writeSamples] 之前调用此方法
     */
    fun start()

    /**
     * 停止复用器进程
     *
     * 如果 [start] 没有成功完成，则不得调用此方法
     */
    fun stop()

    /**
     * 释放复用器进程使用的资源
     *
     * 可以在任何状态下调用。如果复用器进程已启动，它将被停止
     */
    fun release()

    /**
     * 使用指定格式向容器添加轨道
     *
     * 在复用器进程启动后不得调用此方法
     *
     * @param mediaFormat 必须是 [MediaCodec.getOutputFormat] 返回的实例
     */
    fun addTrack(mediaFormat: MediaFormat): Int

    /**
     * 将编码后的样本数据写入输出容器
     *
     * 除非复用器进程已启动，否则不得调用此方法
     *
     * @param trackIndex 必须是 [addTrack] 返回的索引
     */
    fun writeSamples(trackIndex: Int, byteBuffer: ByteBuffer, bufferInfo: MediaCodec.BufferInfo)
}